package org.bopis.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts.Globals;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.actions.DispatchAction;
import org.bopis.domain.UserContainer;
import org.bopis.utilidades.Utilidades;

/**
 * Clase abstracta de Action de la que todas las acciones de tipo Dispatch deben extender.
 * @author usuario
 *
 */
abstract public class CustomDispatchAction extends DispatchAction
{

	
	/**
	 * Metodo que añade a la request un mensaje de error
	 * @param request objeto HttpServletRequest
	 * @param field campo al que se asocia el error (null o vacio para que el mensaje sea global)
	 * @param keyError key del mensaje contenido en el archivo de mensajes
	 */
	protected void addActionError(HttpServletRequest request, String field, String keyError){
		
		ActionErrors errors = (ActionErrors) request.getAttribute(Globals.ERROR_KEY);
		
		if (errors == null)
			errors = new ActionErrors();
		
		if(Utilidades.isVacia(field))
			errors.add(keyError, new ActionMessage(keyError));
		else
			errors.add(field, new ActionMessage(keyError));
		
		request.setAttribute(Globals.ERROR_KEY, errors);
	}
	
	/**
	 * Metodo que añade a la request un mensaje
	 * @param request objeto HttpServletRequest
	 * @param keyMessage key del mensaje contenido en el archivo de mensajes
	 */
	protected void addActionMessage(HttpServletRequest request, String keyMessage){		
		ActionMessages messages = new ActionMessages();
		messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(keyMessage));
		saveMessages(request, messages);
	}
	
	/**
  	 * Metodo que obtiene un objeto de la sesion por su nombre.
  	 * @param req objeto HttpServletRequest
  	 * @param attrName cadena con el nombre del objeto a buscar
  	 * @return objeto Object
  	 */
  	protected Object getSessionObject(HttpServletRequest req, String attrName) 
  	{
	    Object sessionObj = null;
	    HttpSession session = req.getSession(false);
	    
	    if (session != null)
	    {
	       	sessionObj = session.getAttribute(attrName);
    	}
    	
    	return sessionObj;
  	}
  	
  	/**
  	 * Metodo que añade a la sesion un nuevo objeto
  	 * @param req objeto HttpServletRequest
  	 * @param attrName cadena con el nombre del objeto a almacenar
  	 * @param objeto objeto a almacenar
  	 * @return objeto Object
  	 */
  	protected void addObjectToSession(HttpServletRequest req, String attrName, Object objeto) 
  	{
	    HttpSession session = req.getSession(false);
	    
	    if (session != null)
	    {
	       	session.setAttribute(attrName, objeto);
    	}
  	}
  	
  	/**
  	 * Metodo que que elimina un objeto de la sesion
  	 * @param req objeto HttpServletRequest
  	 * @param attrName cadena con el nombre del objeto a eliminar
  	 */
  	protected void removeObjectFromSession(HttpServletRequest req, String attrName)
  	{
	    HttpSession session = req.getSession(false);
	    
	    if (session != null)
	       	session.removeAttribute(attrName);
    	
  	}
  	
  	/**
  	 * Metodo que añade a la request un nuevo objeto
  	 * @param req objeto HttpServletRequest
  	 * @param attrName cadena con el nombre del objeto a almacenar
  	 * @param objeto objeto a almacenar
  	 * @return objeto Object
  	 */
  	protected void addObjectToRequest(HttpServletRequest req, String attrName, Object objeto) 
  	{	  	    
	    if (req != null)
	    {
	       	req.setAttribute(attrName, objeto);
    	}
  	}
  	
  	/**
  	 * Metodo que que elimina un objeto de la request
  	 * @param req objeto HttpServletRequest
  	 * @param attrName cadena con el nombre del objeto a eliminar
  	 */
  	protected void removeObjectFromRequest(HttpServletRequest req, String attrName)
  	{
	    if (req != null)
	       	req.removeAttribute(attrName);
    	
  	}

	/**
  	 * Metodo que devuelve el contenedor de datos de usuario contenido en sesion
  	 * @param request objeto HttpServletRequest
  	 * @return objeto UserContainer
  	 */
  	protected UserContainer getUserContainer(HttpServletRequest request) 
  	{
    	UserContainer userContainer = (UserContainer)getSessionObject(request, "userContainer");
	
	    // Creamos un UserContainer para este usuario si no existe ...
	    if(userContainer == null) 
	    {
	      	userContainer = new UserContainer();
      		HttpSession session = request.getSession(true);
      		session.setAttribute("userContainer", userContainer);
    	}
	
	    return userContainer;
  	}

  	/**
  	 * Metodo que obtiene un objeto del contexto de aplicacion por su nombre
  	 * @param attrName
  	 * @return
  	 */
	protected Object getApplicationObject(String attrName) 
	{
	    return servlet.getServletContext().getAttribute(attrName);
  	}

	/**
	 * Metodo que comprueba si un usuario se encuentra logado
	 * @param request objeto HttpServletRequest
	 * @return true si lo está, false en caso contrario
	 */
  	public boolean isLoggedIn(HttpServletRequest request)
  	{
    	UserContainer container = getUserContainer(request);
    	
    	if (container.getUsuario() != null)
    	{
	       	return true;
    	}
    	else
    	{
	      	return false;
    	}
  	}
  	
}
